package com.itheima.vms.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Base64;

/***
 * 【对称加密算法】：（加密）和（解密）都用同一个（秘钥）
 * AES（Advanced Encryption Standard）是一种对称加密算法，它是一种广泛使用的加密算法，用于保护敏感数据的安全性。AES算法使用相同的密钥来进行加密和解密操作，因此也被称为对称加密算法。
 * AES算法支持不同的密钥长度，包括128位、192位和256位。它采用分组密码的方式，将明文按照固定大小（128位）的块进行分组，并对每个分组进行加密，最终得到密文。在解密时，使用相同的密钥对密文进行解密，还原出原始的明文。
 * 由于AES算法的高效性和安全性，它被广泛应用于各种领域，包括网络通信、数据库加密、文件加密、移动设备安全等。AES算法已被广泛认可和采用，成为了当前最常用的对称加密算法之一。
 */
public class AESUtils {
 
    public static String MODE = "AES/ECB/PKCS5Padding";
    public static String KEY_ALGORITHM = "AES";
    public static String CHARSET = "utf-8";
    private static final int KEY_SIZE = 128;
 
 
    /**
    * 获取密钥
    * @return
    * @throws Exception
    */
   private static Key getKey() throws Exception {
      // 实例
      KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
      // AES 
      kg.init(KEY_SIZE);
      // 生成密钥
      SecretKey secretKey = kg.generateKey();
      return secretKey;
   }
 
 
    /**
     * 加密
     * @param content 内容
     * @param key     秘钥
     * @return 加密后的数据
     */
    public static String encrypt(String content, String key) throws Exception {
        // 新建Cipher 类
        Cipher cipher = Cipher.getInstance(MODE);
        // 初始化秘钥
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(CHARSET), KEY_ALGORITHM);
        // 初始化加密类
        cipher.init(Cipher.ENCRYPT_MODE, sks);
        // 进行加密
        byte[] encrypt = cipher.doFinal(content.getBytes());
        // 这一步非必须，是因为二进制数组不方便传输，所以加密的时候才进行base64编码
        encrypt = Base64.getEncoder().encode(encrypt);
        // 转成字符串返回
        return new String(encrypt, CHARSET);
    }
 
    /**
     * 解密数据
     * @param content 内容
     * @param key     秘钥
     * @return 数据
     */
    public static String decrypt(String content, String key) throws Exception{
        // 替换base64里的换行,这一步也非必须，只是有些情况base64里会携带换行符导致解码失败
        content = content.replaceAll("[\\n\\r]", "");
        // base64 解码，跟上面的编码对称
        byte[] data = Base64.getDecoder().decode(content.getBytes(CHARSET));
        // 新建Cipher 类
        Cipher cipher = Cipher.getInstance(MODE);
        // 初始化秘钥
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARSET), KEY_ALGORITHM);
        // 初始化类
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        // 解密
        byte[] result = cipher.doFinal(data);
        // 返回解密后的内容
        return new String(result);
    }

    public static void main(String[] args) throws Exception {
        //长度16，占128位
        String key ="9439db3bdc084fc9";
        //对123456加密
        String pwd = encrypt("123456", key);
        System.out.println(pwd);

        //对加密后的密文解密
        String decrypt = decrypt(pwd, key);
        System.out.println(decrypt);
    }
}